package com.itheima.cjlib;


import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;

public class ProxyTest {
    //aop基于动态代理实现
    /*
     * 常用的动态代理技术
     * 1 JDK代理:基于接口的动态代理技术
     * 2 cglib代理:基于父类的动态代理技术
     * */
    public static void main(String[] args) {
        cjlibProxy();
    }


    /**
     * 基于cglib的依托于父类的代理 示例
     * 其实就是动态生成目标对象的子类,对方法进行增强,并进行封装
     * 这是基本原理,spring会进行封装,让你方便的使用动态代理技术,进行aop编程
     */
    private static void cjlibProxy() {
        //目标对象 被代理对象
        final Target target = new Target();
        //增强对象
        final Advice advice = new Advice();
        //返回值 动态生成的代理对象
        Enhancer enhancer = new Enhancer();
        enhancer.setSuperclass(Target.class);
        enhancer.setCallback(new MethodInterceptor() {
            public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
                //前置增强
                advice.before();
                Object invoke = method.invoke(target, args);//执行目标方法
                //后置增强
                advice.after();
                return invoke;
            }
        });
        //最终产生的代理对象
        Target proxy = (Target) enhancer.create();
        proxy.save();
    }
}
